// 许多应用，我们都希望记录一个输入流或完全不同的一些图像到视频流中。
// OpenCV中cv::VideoWriter实例化后，我们就可以将每一帧图像输入到cv::VideoWriter对象中。

// 以下程序会打开一个视频文件，读取它的内容后将其转换为对数极坐标(log-polar)形式（类似于人眼真正捕捉到的图像的形式，详细信息参阅第11章），然后将对数极坐标图像写入一个新的视频文件
#include <opencv2/opencv.hpp>
#include <iostream>

int main(int argc, char* argv[]){
    cv::namedWindow("Example2_11", cv::WINDOW_AUTOSIZE);
    cv::namedWindow("Log_Polar", cv::WINDOW_AUTOSIZE);

    // (Note: could capture from a camera by giving a camera id as an int.)
    cv::VideoCapture capture(argv[1]);

    double fps = capture.get(cv::CAP_PROP_FPS);
    cv::Size size(
        (int)capture.get(cv::CAP_PROP_FRAME_WIDTH),
        (int)capture.get(cv::CAP_PROP_FRAME_HEIGHT)
    );

    cv::VideoWriter writer;
    // 我们选择了通用的MJPG编码器，通过使用OpenCV所提供的宏CV_FOURCC()指定它，这个宏讲四个字符作为参数
    writer.open(argv[2], CV_FOURCC('M', 'J', 'P', 'G'), fps, size);

    cv::Mat logpolar_frame, bgr_frame;
    for(;;){
        capture >> bgr_frame;
        if(bgr_frame.empty()) break; // end if done
        
        cv::imshow("Example2_11", bgr_frame);

        cv::logPolar(
            bgr_frame,              // Input color frame
            logpolar_frame,         // Output log-polar frame
            cv::Point2f(            // Centerpoint for log-polar transformation
                bgr_frame.cols/2,   // x
                bgr_frame.rows/2    // y
            ),
            40,
            cv::WARP_FILL_OUTLIERS
        );

        cv::imshow("Log_Polar", logpolar_frame);
        writer << logpolar_frame;

        char c = cv::waitKey(10);
        if(c == 27 ) break;        // allow the user to break out
    }
    capture.release();
}